﻿using System;
using System.Collections.Generic;
using System.Data;
using br.com.SistemaChamados.Enum;
using br.com.SistemaChamados.Model;
using br.com.SistemaChamados.QueryManager.Core;
using br.com.SistemaChamados.QueryManager.Core.Behavior;

namespace br.com.SistemaChamados.DAO
{
    public class StateDAO : GenericDao<State>
    {

        /// <summary>
        /// Método responsável por pegar um estado do banco de dados de acordo com seu identificador
        /// </summary>
        /// <param name="stateId">código do estado</param>
        /// <returns>um objeto State</returns>
        public static State getState(int stateId)
        {
            State stateReturn = new State();
            try
            {
                stateReturn = (State)QueryManagerPerformer.Select(typeof(State), "Id", stateId, ConnectionBehavior.CONNECTION_BEHAVIOR_CLOSE_AFTER_OPERATION);
            }
            catch (Exception ex)
            {
                stateReturn = null;
                throw ex;
            }
            return stateReturn;
        }

        /// <summary>
        /// Método responsável por recuperar todos os estados do banco de dados
        /// </summary>
        /// <returns></returns>
        public static List<State> getStates()
        {
            List<State> list = new List<State>();
            IDbConnection conn = null;
            State stateReturn = new State();
            try
            {
                list = QueryManagerPerformer.Select(typeof(State), ConnectionBehavior.CONNECTION_BEHAVIOR_CLOSE_AFTER_OPERATION)
                        .ConvertAll(convertObject);
            }
            catch (Exception ex)
            {
                list = null;
                throw ex;
            }
            finally
            {
                if (conn != null) conn.Close();
            }
            return list;
        }

        /// <summary>
        /// Método responsável por inserir um objeto State no banco de dados
        /// </summary>
        /// <param name="state">objeto State a ser inserido</param>
        /// <returns>Condição de retorno da execução da SQL</returns>
        public static EnumGenericState InsertState(State state)
        {
            EnumGenericState stateTransaction = EnumGenericState.GENERIC_STATE_UNKNOW;
            IDbConnection conn = null;
            try
            {
                QueryManagerPerformer.Insert(state, new string[] { "Id" }, ConnectionBehavior.CONNECTION_BEHAVIOR_CLOSE_AFTER_OPERATION);
                stateTransaction = EnumGenericState.GENERIC_STATE_SUCCESS;
            }
            catch (Exception ex)
            {
                stateTransaction = EnumGenericState.GENERIC_STATE_FAILED;
                throw ex;
            }
            finally
            {
                if (conn != null) conn.Close();
            }

            return stateTransaction;

        }

        /// <summary>
        /// Método responsável por atualizar um objeto State no banco de dados
        /// </summary>
        /// <param name="state">objeto State a ser atualizado</param>
        /// <returns>Condição de retorno da execução da SQL</returns>
        public static EnumGenericState UpdateState(State state)
        {
            EnumGenericState stateTransaction = EnumGenericState.GENERIC_STATE_UNKNOW;
            IDbConnection conn = null;
            try
            {
                QueryManagerPerformer.Update(state, "Id", state.Id, ConnectionBehavior.CONNECTION_BEHAVIOR_CLOSE_AFTER_OPERATION);
                stateTransaction = EnumGenericState.GENERIC_STATE_SUCCESS;
            }
            catch (Exception ex)
            {
                stateTransaction = EnumGenericState.GENERIC_STATE_FAILED;
                throw ex;
            }
            finally
            {
                if (conn != null) conn.Close();
            }
            return stateTransaction;
        }

        /// <summary>
        /// Método responsável por deletar um objeto State do banco de dados
        /// </summary>
        /// <param name="state">objeto State a ser removido do banco de dados</param>
        /// <returns>Condição de retorno da execução da SQL</returns>
        public static EnumGenericState DeleteState(State state)
        {
            EnumGenericState stateTransaction = EnumGenericState.GENERIC_STATE_UNKNOW;
            IDbConnection conn = null;
            try
            {
                QueryManagerPerformer.Delete(state, ConnectionBehavior.CONNECTION_BEHAVIOR_CLOSE_AFTER_OPERATION);
                stateTransaction = EnumGenericState.GENERIC_STATE_SUCCESS;
            }
            catch (Exception ex)
            {
                stateTransaction = EnumGenericState.GENERIC_STATE_FAILED;
                throw ex;
            }
            finally
            {
                if (conn != null) conn.Close();
            }
            return stateTransaction;
        }
    }
}